package workCount;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.apache.hadoop.io.IOUtils;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;

public class HDFS_client {
    //conf获得与HDFS的连接配置信息
    Configuration conf;
    //通过conf的配置信息进行文件系统连接操作
    FileSystem fs;

    public HDFS_client(String URL,String username) throws IOException, URISyntaxException, InterruptedException {
        //与HDFS的服务端进行连接
        conf = new Configuration();
        conf.set("fs.defaultFS", URL);
        //设置副本数为1
        conf.set("dfs.replication", "1");
        fs = FileSystem.get(new URI(URL),conf,username);
    }

    //判定目录是否存在，如果不存在则创建目录，如果存在则删除原有目录并创建
    public void createDir(String pathName) throws IOException {
        //在HDFS当中创建一个目录
        Path path = new Path(pathName);
        if (fs.exists(path)){
            deleteFile(pathName);
        }
        fs.mkdirs(path);
        System.out.println("\nCreate path success\n");
    }

    //上传文件
    public void uploadFile(String localDir,String srcDir) throws IOException {
        //将本地文件上传到HDFS当中
        //只是单独传递文件
        //fs.copyFromLocalFile(new Path("D:\\data\\test.txt"),new Path("/20240813-bd/test1/test.txt"));
        //在传递完成之后将本地文件删除
        fs.copyFromLocalFile(new Path(localDir),new Path(srcDir));
    }

    //查看指定文件内容
    //查看文件的内容，查看目录内所有文件的内容
    public void printFile(String fileName) throws IOException {
        //获得到指定路径下的所有文件信息
        RemoteIterator<LocatedFileStatus> status = fs.listFiles(new Path(fileName), true);
        //创建一个流，主要用来接受文件读取的内容
        InputStream in;
        //读取指定文件的详细信息
        LocatedFileStatus fileStatus;
        //判定文件是否为空
        while (status.hasNext()) {
            fileStatus = status.next();
            //打开一个文件，文件的路径来自于文件详细信息中的路径信息
            in = fs.open(fileStatus.getPath());
            IOUtils.copyBytes(in, System.out, 512);
            IOUtils.closeStream(in);
        }
    }

    //删除指定文件
    public void deleteFile(String fileName) throws IOException {
        Path path = new Path(fileName);
        fs.delete(path, true);
        System.out.println("\nDelete path success\n");
    }

    //创建方法：与HDFS的断开连接
    public void close() throws IOException {
        fs.close();
    }

}